package com.ads.tpgrupo4.server.service.generarOrdenesDeCompra;

import java.util.List;

import com.ads.tpgrupo4.domain.cpr.ordenDeCompra.OrdenDeCompra;
import com.ads.tpgrupo4.domain.cpr.ordenDeCompra.OrdenDeCompraPorCotizacion;
import com.ads.tpgrupo4.domain.cpr.ordenDeCompra.TipoDeOrigenDeOrdenDeCompra;
import com.ads.tpgrupo4.domain.cpr.ordenDePedido.EstadoOrdenDePedido;
import com.ads.tpgrupo4.domain.cpr.ordenDePedido.OrdenDePedido;
import com.ads.tpgrupo4.server.config.Config;
import com.ads.tpgrupo4.server.fileserver.FileServer;
import com.ads.tpgrupo4.server.remote.PersistenceService;
import com.ads.tpgrupo4.server.service.generarCotizacionesPendientes.OutputFilesUrlUtils;
import com.ads.tpgrupo4.server.utils.UriUtils;
import com.ads.tpgrupo4.server.xml.XmlSource;
import com.ads.tpgrupo4.server.xml.mappers.OrdenDeCompraXmlMapper;

public class GenerarOrdenesDeCompraService {
	
	private GeneradorDeOrdenesDeCompra generadorDeOrdenesDeCompra = GeneradorDeOrdenesDeCompra.getInstance();
	
	private PersistenceService persistenceService = PersistenceService.getInstance();
	
	private static GenerarOrdenesDeCompraService instance;
	
	public static GenerarOrdenesDeCompraService getInstance() {

		if (instance == null) {
			instance = new GenerarOrdenesDeCompraService();
		}
		
		return instance;
	}
	
	private GenerarOrdenesDeCompraService() {
	}
	
	public void generarOrdenesDeCompraPendientes() {
		
		try {
			
			final List<OrdenDePedido> ordenesDePedidoAProcesar = this.persistenceService
					.findOrdenesDePedidoPendientes();
			final List<OrdenDeCompra> ordenesDeCompra = this.generadorDeOrdenesDeCompra
					.generarOrdenesDeCompraAPartirDe(ordenesDePedidoAProcesar);

			this.persistenceService.saveOrdenesDeCompra(ordenesDeCompra);
			
			for (final OrdenDeCompra ordenDeCompra : ordenesDeCompra) {
	
				this.trySaveToFileSystem(ordenDeCompra);
			}
			
			for (final OrdenDePedido ordenDePedido : ordenesDePedidoAProcesar) {
				this.persistenceService.updateEstadoOrdenDePedido(ordenDePedido.getId(), EstadoOrdenDePedido.PROCESADA);
			}
			
		} catch (final Exception e) {
		
			throw new GenerarOrdenesDeCompraServiceException(e);
		}
	}
	
	private void trySaveToFileSystem(final OrdenDeCompra oc) {
		try {
			
			if (oc.getTipoDeOrigen() == TipoDeOrigenDeOrdenDeCompra.PEDIDOS_DE_COTIZACION) {
				
				final OrdenDeCompraPorCotizacion ordenDeCompra = (OrdenDeCompraPorCotizacion)oc;
				
				final String fileName = OutputFilesUrlUtils.getExpectedFileNameFor(ordenDeCompra);
				final String filePath = UriUtils.buildPath(Config.getInstance().getGeneratedFilesContainerDir(), fileName);
				
				final XmlSource asXml = OrdenDeCompraXmlMapper.getInstance().map(ordenDeCompra);
				
				FileServer.createFile(asXml.toString(), filePath);
			}
			
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}


}
